import useRequestImplement from "./useRequestImplement";
//import useLoggerPlugin from './plugins/useLoggerPlugin';
import useLoadingDelayPlugin from "./plugins/useLoadingDelayPlugin";
import usePollingPlugin from "./plugins/usePollingPlugin";
import useAutoPlugin from "./plugins/useAutoPlugin";
import useRefreshOnWindowFocusPlugin from "./plugins/useRefreshOnWindowFocusPlugin";
import useDebouncePlugin from "./plugins/useDebouncePlugin";
import useThrottlePlugin from "./plugins/useThrottlePlugin";
import useRetryPlugin from "./plugins/useRetryPlugin";
import useCachePlugin from "./plugins/useCachePlugin";

/**
 * https://ahooks.js.org/zh-CN/hooks/use-request/basic
 *
 * 自动请求:
 *  默认情况下，useRequest 第一个参数是一个异步函数，在组件初始化时，会自动执行该异步函数。
 *  自动请求可以传入初始化数据，同时自动管理该异步函数的 loading , data, error 等状态
 * 手工触发:
 *  如果设置 options.manual = true 则 useRequest 不会默认执行，需要通过 run 或者 runAsync 来触发执行
 * 生命周期:
 *  onBefore：请求之前触发
 *  onSuccess：请求成功触发
 *  onError：请求失败触发
 *  onFinally：请求完成触发
 *  onCancel:取消响应
 * 刷新(重复上一次请求):
 *  refresh 和 refreshAsync 方法，使我们可以使用上一次的参数，重新发起请求
 *
 * 立即变更数据(乐观更新):
 *  与 setState 类似，支持立即修改useRequest返回的data参数。
 *  一般失败后在组件中赋值为上一次的值
 *
 * 取消响应
 *  用于忽略当前 promise 返回的数据和错误，调用 cancel 函数并不会取消 promise 的执行
 *  取消动机：
 *    组件卸载时，正在进行的 promise，
 *    竞态取消，当上一次 promise 还没返回时，又发起了下一次 promise，则会忽略上一次 promise 的响应
 *
 * ------------------------------------------------------------------------------------
 *
 * 插件系统
 * 提供的钩子函数：
 *  onBefore	  请求前
 *  onRequest	  请求中
 *  onSuccess	  请求成功
 *  onError	    请求失败
 *  onFinally	  请求结束
 *  onMutate	  修改结果数据
 *  onCancel	  请求取消
 *  onInit	    初始化状态
 */
function useRequest(service, options, plugins = []) {
  return useRequestImplement(service, options, [
    ...plugins,
    //useLoggerPlugin,
    useLoadingDelayPlugin,
    usePollingPlugin,
    useAutoPlugin,
    useRefreshOnWindowFocusPlugin,
    useDebouncePlugin,
    useThrottlePlugin,
    useRetryPlugin,
    useCachePlugin,
  ]);
}
export default useRequest;
